
#ifndef ReadOnlyCollection_h
#define ReadOnlyCollection_h

// CSharp includes.
#include <Typedef.h>
#include <Defines.h>

// Riccsson includes.
#include <System/Array.h>
#include <System/Collections/Generic/IList.h>
#include <System/Collections/Generic/ICollection.h>
#include <System/Collections/Generic/IEnumerable.h>
#include <System/Collections/Generic/IReadOnlyCollection.h>
#include <System/Collections/Generic/IEnumerator.h>
#include <System/Object.h>
#include <System/String.h>

namespace Riccsson
{
	namespace System
	{
		namespace Collections
		{
			namespace ObjectModel
			{
				// Summary:
				//     Provides the base class for a generic read-only collection.
				//
				// Type parameters:
				//   T:
				//     The type of elements in the collection.
				template<typename T> class ReadOnlyCollection
					: Riccsson::System::Collections::Generic::IList<T>
					//, Riccsson::System::Collections::Generic::ICollection<T> // Already defined in IEnumerator.
					//, Riccsson::System::Collections::Generic::IList
					//, Riccsson::System::Collections::Generic::ICollection
					//, Riccsson::System::Collections::Generic::IReadOnlyList<T> // Not implemented.
					, Riccsson::System::Collections::Generic::IReadOnlyCollection<T>
					//, Riccsson::System::Collections::Generic::IEnumerable<T> // Already defined in IEnumerator.
					//, Riccsson::System::Collections::Generic::IEnumerable
				{
					
					PROP3GET(ReadOnlyCollection<T>, int, Count)
					PROP3GET(ReadOnlyCollection<T>, GC_PTR<Riccsson::System::Collections::Generic::IList<T>>, Items)
					
					COPY_CONSTRUCTOR(ReadOnlyCollection<T>)
					{
						PROP3GET_INIT_COPY(ReadOnlyCollection<T>, int, Count);
						PROP3GET_INIT_COPY(ReadOnlyCollection<T>, GC_PTR<Riccsson::System::Collections::Generic::IList<T>>, Items);
					}

					// Summary:
					//     Initializes a new instance of the System.Collections.ObjectModel.ReadOnlyCollection<T>
					//     class that is a read-only wrapper around the specified list.
					//
					// Parameters:
					//   list:
					//     The list to wrap.
					//
					// Exceptions:
					//   System.ArgumentNullException:
					//     list is null.
					public: ReadOnlyCollection(GC_PTR<Riccsson::System::Collections::Generic::IList<T>> list)
						: PROP3GET_INIT(ReadOnlyCollection<T>, Count)
						, PROP3GET_INIT(ReadOnlyCollection<T>, Items)
					{
						throw;
					}

					// Summary:
					//     Gets the number of elements contained in the System.Collections.ObjectModel.ReadOnlyCollection<T>
					//     instance.
					//
					// Returns:
					//     The number of elements contained in the System.Collections.ObjectModel.ReadOnlyCollection<T>
					//     instance.
					public: PROP3_GET(int, Count)
					{
						throw;
					}

					//
					// Summary:
					//     Returns the System.Collections.Generic.IList<T> that the System.Collections.ObjectModel.ReadOnlyCollection<T>
					//     wraps.
					//
					// Returns:
					//     The System.Collections.Generic.IList<T> that the System.Collections.ObjectModel.ReadOnlyCollection<T>
					//     wraps.
					protected: PROP3_GET(GC_PTR<Riccsson::System::Collections::Generic::IList<T>>, Items)
					{
						throw;
					}

					// Summary:
					//     Gets the element at the specified index.
					//
					// Parameters:
					//   index:
					//     The zero-based index of the element to get.
					//
					// Returns:
					//     The element at the specified index.
					//
					// Exceptions:
					//   System.ArgumentOutOfRangeException:
					//     index is less than zero.-or-index is equal to or greater than System.Collections.ObjectModel.ReadOnlyCollection<T>.Count.
					public: T& operator[] (int index)
					{
						throw;
					}

					public: T at(int index) const
					{
						throw;
					}

					// Summary:
					//     Determines whether an element is in the System.Collections.ObjectModel.ReadOnlyCollection<T>.
					//
					// Parameters:
					//   value:
					//     The object to locate in the System.Collections.ObjectModel.ReadOnlyCollection<T>.
					//     The value can be null for reference types.
					//
					// Returns:
					//     true if value is found in the System.Collections.ObjectModel.ReadOnlyCollection<T>;
					//     otherwise, false.
					//[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
					public: bool Contains(T* value)
					{
						throw;
					}

					//
					// Summary:
					//     Copies the entire System.Collections.ObjectModel.ReadOnlyCollection<T> to
					//     a compatible one-dimensional System.Array, starting at the specified index
					//     of the target array.
					//
					// Parameters:
					//   array:
					//     The one-dimensional System.Array that is the destination of the elements
					//     copied from System.Collections.ObjectModel.ReadOnlyCollection<T>. The System.Array
					//     must have zero-based indexing.
					//
					//   index:
					//     The zero-based index in array at which copying begins.
					//
					// Exceptions:
					//   System.ArgumentNullException:
					//     array is null.
					//
					//   System.ArgumentOutOfRangeException:
					//     index is less than zero.
					//
					//   System.ArgumentException:
					//     The number of elements in the source System.Collections.ObjectModel.ReadOnlyCollection<T>
					//     is greater than the available space from index to the end of the destination
					//     array.
					public: void CopyTo(Array<T>* array, int index)
					{
						throw;
					}

					//
					// Summary:
					//     Returns an enumerator that iterates through the System.Collections.ObjectModel.ReadOnlyCollection<T>.
					//
					// Returns:
					//     An System.Collections.Generic.IEnumerator<T> for the System.Collections.ObjectModel.ReadOnlyCollection<T>.
					//[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
					public: Riccsson::System::Collections::Generic::IEnumerator<T>* GetEnumerator()
					{
						throw;
					}

					//
					// Summary:
					//     Searches for the specified object and returns the zero-based index of the
					//     first occurrence within the entire System.Collections.ObjectModel.ReadOnlyCollection<T>.
					//
					// Parameters:
					//   value:
					//     The object to locate in the System.Collections.Generic.List<T>. The value
					//     can be null for reference types.
					//
					// Returns:
					//     The zero-based index of the first occurrence of item within the entire System.Collections.ObjectModel.ReadOnlyCollection<T>,
					//     if found; otherwise, -1.
					public: int IndexOf(T* value)
					{
						throw;
					}
				};
			}
		}
	}
}

#endif